package com.jiangyg.mall.core.utils;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 工具类描述：正则表达式
 *
 * @author jiangyg
 * @version 2.0
 * @date 2019-10-20
 */
public class RegexUtils {

    /**
     * 变量正则匹配（替换大括号）
     */
    public static final Pattern VARIABLE_PATTERN = Pattern.compile("(?<=\\{)(.+?)(?=\\})");

    /**
     * name属性匹配正则
     */
    public static final Pattern NAME_PROPERTY_PATTERN = Pattern.compile("(?<=name=\")(.+?)(?=\")");

    /**
     * 功能描述：正则匹配，大小写敏感
     *
     * @param regex 表达式
     * @param input 文本
     * @return boolean
     */
    public static boolean matcher(final String regex, final String input) {
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        return matcher.matches();
    }

    /**
     * 功能描述：正则匹配，大小写不敏感
     *
     * @param regex 表达式
     * @param input 文本
     * @return boolean
     */
    public static boolean matcherIgnoreCase(final String regex, final String input) {
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(input);
        return matcher.matches();
    }

    /**
     * 功能描述：name属性正则替换
     *
     * @param input       文本
     * @param replacement 替换内容
     * @return 替换后的字符串
     */
    public static String namePropertyReplace(final String input, final String replacement) {
        return NAME_PROPERTY_PATTERN.matcher(input).replaceAll(replacement);
    }

    /**
     * 功能描述：正则替换变量符号（变量符号为{0}……{n:11}，:号后面为默认值）
     *
     * @param input     文本
     * @param variables 变量数组
     * @return 替换后的字符串
     */
    public static String variableReplace(final String input, final String[] variables) {
        String temp = input;
        Matcher matcher = VARIABLE_PATTERN.matcher(input);
        while (matcher.find()) {
            String content = matcher.group(1).trim();
            // 变量替换不能出现多个冒号
            if (StringUtils.indexOf(content, ":") != StringUtils.lastIndexOf(content, ":")) {
                continue;
            }
            String variable = StringUtils.EMPTY;
            // 带有:号，表示变量有默认值，:号前为变量序号，:号后为默认值
            String index;
            if (content.contains(":")) {
                String[] cs = content.split(":");
                index = cs[0];
                variable = cs[1];
            } else {
                index = content;
            }
            // 变量序号只有为数字才生效
            if (NumberUtils.isNumber(index)) {
                int iindex = Integer.parseInt(index);
                if (variables != null && variables.length >= iindex + 1) {
                    variable = variables[iindex];
                }
                temp = temp.replace("{" + content + "}", variable);
            }
        }
        return temp;
    }

}
